ojichatをサーバーレスAPI化した
ojichatをAPI化する必要があったため、AWS SAMを利用してサーバーレスな構成で実装してみました。
概要
ojichat とは、READMEにも書かれているとおり、「おじさんがLINEやメールで送ってきそうな文を生成」してくれる物となります。
既にDockerで環境を汚さずに利用する事も出来ますが、今回はAPI化する必要がありましたので、簡単なLambda関数を作ってみました。
作ったもの
AWSの構成は下記のように、シンプルなAPI Gateway + Lambdaの構成となります。
Goで次のように、BodyからNameを取得して greymd/ojichat/generator
を利用しておじさん文章を生成して返却する簡単なコードを書きました。
package main import ( "encoding/json" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "github.com/greymd/ojichat/generator" ) type Payload struct { Name string `json:"name"` } type Response struct { Message string `json:"message"` } func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { var payload Payload err := json.Unmarshal([]byte(request.Body), &payload) if err != nil { return events.APIGatewayProxyResponse{ Body: err.Error(), StatusCode: 500, }, err } config := generator.Config{ TargetName: payload.Name, EmojiNum: 4, PunctuationLevel: 0, } ojiResult, err := generator.Start(config) if err != nil { return events.APIGatewayProxyResponse{ Body: err.Error(), StatusCode: 500, }, err } res := Response{ Message: ojiResult, } jsonResult, _ := json.Marshal(res) return events.APIGatewayProxyResponse{ Body: string(jsonResult), StatusCode: 200, }, nil } func main() { lambda.Start(handler) }
また、API GatewayやLambdaの構成管理はAWS SAMを使っていて、簡単なYAMLで構成管理できるようにしています。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: serverless-ojichat Globals: Function: Timeout: 5 Resources: OjiFunction: Type: AWS::Serverless::Function Properties: CodeUri: oji/ Handler: oji Runtime: go1.x Tracing: Active Events: CatchAll: Type: Api Properties: Path: /oji Method: POST Outputs: OjiAPI: Description: API Endpoint URL Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/oji"
コードなどは mokocm/serverless-ojichatで公開しています。
利用方法
デプロイにはAWS SAMを利用するため、インストールしていない場合は下記ドキュメントに記載の通りインストールを行います。
デプロイ手順は次の通りです。
git clone https://github.com/mokonist/serverless-ojichat/ cd serverless-ojichat/ sam build sam deploy --guided Configuring SAM deploy ====================== Looking for config file [samconfig.toml] : Not found Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: serverless-ojichat AWS Region [us-east-1]: ap-northeast-1 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: y #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: y OjiFunction may not have authorization defined, Is this okay? [y/N]: y Save arguments to configuration file [Y/n]: y SAM configuration file [samconfig.toml]: SAM configuration environment [default]:
SAMでのデプロイ作業が終わると、Outputs枠にAPI GatewayのEndpoint URLが表示されます。
CloudFormation outputs from deployed stack Key OjiAPI Description API Endpoint URL Value https://66tc6jmsxg.execute-api.ap-northeast-1.amazonaws.com/Prod/oji Successfully created/updated stack - serverless-ojichat in ap-northeast-1
こちらのURLを利用して、curlで適当な名前をPOSTしておじさん文章を生成してみましょう。
curl -X POST https://66tc6jmsxg.execute-api.ap-northeast-1.amazonaws.com/Prod/oji -d '{"name": "ぴよ"}' {"message":"ぴよちゃん、お疲れ様〜??♥ 今日はどんな一日だった?僕は、すごく心配だよ(-_-;)?( ̄Д ̄;;そんなときは、美味しいもの食べて、元気出さなきゃだね?"}
まとめ
今回Goを使ったAPI Gateway + Lambdaの構成を初めて組んでみましたが、数時間で簡単に作る事ができました。
AWS SAMはPython、Nodeくらいしか使えないのかと思ってましたが、Goも行けることを初めて知りました。
突然ojichatをAPI化する必要が出てきてもすぐ使えるように、GitHubで公開していますので、ojichatをAPI化する際は是非お使いください。
誰かにお役に立てれば幸いです。